package com.tj.bigdata.syncblock.entity;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.List;

/**
 * 合约注册交易中唯一需要的就是在data字段中包含经过编译的合约字节码。这个交易的唯一用处就是把合约注册到以太坊区块链上。向零地址发送包含data值的交易
 *
 * @author guoch
 */
@Data
@Accessors(chain = true)
public class Transactions implements Serializable {

    /**
     * 区块hash
     */
    private String blockHash;

    /**
     * 区块号
     */
    private BigInteger blockNumber;

    /**
     * 发起交易的外部地址
     * 由椭圆曲线数字签名算法的v,r,s这三个组件计算得出
     */
    private String from;

    /**
     * 目标以太坊地址  这个地址既可以是外部账户，也可以是合约的地址。
     */
    private String to;

    private BigInteger timeStamp;

    private BigInteger gas;

    /**
     * 交易发起方愿意支付的gas（单位：wei）价格。
     */
    private BigInteger gasPrice;

    private String hash;

    private BigInteger transactionIndex;

    /**
     * data 只包含data的交易是针对合约的调用  如果目标地址（to）是一个合约，那么EVM会执行这个合约，并尝 试调用在交易的data字段中指定的函数
     * 当交易的data字段含有内容时，多数情况下这个交易的目标是一个合约
     */
    private String input;

    /**
     * 一个序列编号，由构建这个交易的外部账号提供，用于防止交易的重放攻击
     */
    private BigInteger nonce;

    /**
     * 发送给目标地址的以太币的数量。
     */
    private BigInteger value;

    /**
     * 交易的类型，ContractCreation（创建合约）还是MessageCall（调用合约或转账）
     */
    private String type;

    /**
     * 当这笔交易是部署新合约时，记录新合约的地址
     */
    private String contractAddress;

    /**
     * 区块中已执行的交易累计消耗的Gas，包含当前交易
     */
    private BigInteger cumulativeGasUsed;

    /**
     * 这笔交易执行所消耗的Gas燃料
     */
    private BigInteger gasUsed;

    /**
     * 是从 Logs 中提取的事件布隆过滤器，用于快速检测某主题的事件是否存在于Logs中
     */
    private String logsBloom;

    private String root;

    /**
     * 成功与否，1表示成功，0表示失败
     */
    private String status;

    /**
     * 由构建交易的外部账户提供的椭圆曲线签名的三个组成部分。
     */
    private Long v;

    private String r;

    private String s;

    /**
     * 当前交易执行所产生的智能合约事件列表
     */
    private List<ReceiptLog> logs;
}
